📚Загадочная библиотека setjmp.h — неочевидный инструмент для управления потоком выполнения
Библиотека setjmp.h предоставляет два необычных макроса:
• setjmp — сохраняет текущее состояние программы (регистры, стек) в буфер jmp_buf
• longjmp — «откатывает» выполнение к сохранённому состоянию, как прыжок во времени
#include <stdio.h> #include <setjmp.h>
jmp_buf jump_buffer;
void risky_function() { printf("Готовимся к прыжку...\n"); longjmp(jump_buffer, 42); // Прыжок обратно в setjmp! }
int main() { int ret = setjmp(jump_buffer); if (ret == 0) { printf("Первая инициализация...\n"); risky_function(); } else { printf("Вернулись с кодом: %d\n", ret); // Выведет 42! } return 0; }
⚠️Осторожно!
• Не заменяет исключения — нет вызова деструкторов (как в C++) • Опасность утечек — если между setjmp и longjmp выделялась память, она не освободится • Портит стек — может сломать логику функций
🛠Где может пригодиться?
• Обработка критических ошибок (а-ля «аварийный выход») • Код для встраиваемых систем, где нужно быстро восстановить состояние • Нестандартные хаки (но лучше так не делать 😈)
📚Загадочная библиотека setjmp.h — неочевидный инструмент для управления потоком выполнения
Библиотека setjmp.h предоставляет два необычных макроса:
• setjmp — сохраняет текущее состояние программы (регистры, стек) в буфер jmp_buf
• longjmp — «откатывает» выполнение к сохранённому состоянию, как прыжок во времени
#include <stdio.h> #include <setjmp.h>
jmp_buf jump_buffer;
void risky_function() { printf("Готовимся к прыжку...\n"); longjmp(jump_buffer, 42); // Прыжок обратно в setjmp! }
int main() { int ret = setjmp(jump_buffer); if (ret == 0) { printf("Первая инициализация...\n"); risky_function(); } else { printf("Вернулись с кодом: %d\n", ret); // Выведет 42! } return 0; }
⚠️Осторожно!
• Не заменяет исключения — нет вызова деструкторов (как в C++) • Опасность утечек — если между setjmp и longjmp выделялась память, она не освободится • Портит стек — может сломать логику функций
🛠Где может пригодиться?
• Обработка критических ошибок (а-ля «аварийный выход») • Код для встраиваемых систем, где нужно быстро восстановить состояние • Нестандартные хаки (но лучше так не делать 😈)
The Singapore stock market has alternated between positive and negative finishes through the last five trading days since the end of the two-day winning streak in which it had added more than a dozen points or 0.4 percent. The Straits Times Index now sits just above the 3,060-point plateau and it's likely to see a narrow trading range on Monday.
Among the actives, Ascendas REIT sank 0.64 percent, while CapitaLand Integrated Commercial Trust plummeted 1.42 percent, City Developments plunged 1.12 percent, Dairy Farm International tumbled 0.86 percent, DBS Group skidded 0.68 percent, Genting Singapore retreated 0.67 percent, Hongkong Land climbed 1.30 percent, Mapletree Commercial Trust lost 0.47 percent, Mapletree Logistics Trust tanked 0.95 percent, Oversea-Chinese Banking Corporation dropped 0.61 percent, SATS rose 0.24 percent, SembCorp Industries shed 0.54 percent, Singapore Airlines surrendered 0.79 percent, Singapore Exchange slid 0.30 percent, Singapore Press Holdings declined 1.03 percent, Singapore Technologies Engineering dipped 0.26 percent, SingTel advanced 0.81 percent, United Overseas Bank fell 0.39 percent, Wilmar International eased 0.24 percent, Yangzijiang Shipbuilding jumped 1.42 percent and Keppel Corp, Thai Beverage, CapitaLand and Comfort DelGro were unchanged.
Библиотека собеса по C | вопросы с собеседований from sa